package com.yuzhihao.writejvm.clazz;

import com.yuzhihao.writejvm.attributes.Attributes;
import com.yuzhihao.writejvm.constant.ConstantPool;
import com.yuzhihao.writejvm.field.Fields;
import com.yuzhihao.writejvm.format.PrintFormat;
import com.yuzhihao.writejvm.intfec.InterfaceInfo;
import com.yuzhihao.writejvm.method.Methods;
import lombok.Data;

/**
 * 类信息
 *
 * @author yzh
 * @date 2021年11月29日16:15:22
 */
@Data
public class ClassInfo {

    /**
     * 魔法值
     */
    private Magic magic;
    /**
     * 小版本
     */
    private MinorVersion minor_version;
    /**
     * 大版本
     */
    private MajorVersion major_version;
    /**
     * 常量池统计数量（索引从1开始）
     */
    private int constant_pool_count;
    /**
     * 常量池信息
     */
    private ConstantPool cp_info;
    /**
     * 访问标记
     */
    private AccessFlags access_flags;
    /**
     * 当前类限定名称
     */
    private ThisClass this_class;
    /**
     * 父类限定名称
     */
    private SuperClass super_class;
    /**
     * 接口统计数量
     */
    private int interfaces_count;
    /**
     * 接口信息数组
     */
    private InterfaceInfo interfaces;
    /**
     * 字段统计数量
     */
    private int fields_count;
    /**
     * 字段数组信息
     */
    private Fields field_info;
    /**
     * 方法统计数量
     */
    private int methods_count;
    /**
     * 方法数组信息
     */
    private Methods method_info;
    /**
     * 属性统计数量
     */
    private int attributes_count;
    /**
     * 属性数组信息
     */
    private Attributes attribute_info;

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        //类信息
        builder.append(this.this_class);
        //继承类信息
        builder.append(this.super_class);
        //魔法
        builder.append(this.magic);
        //版本小
        builder.append(this.minor_version);
        //版本大
        builder.append(this.major_version);
        //类的访问标识
        builder.append(this.access_flags);
        //常量池
        builder.append(this.cp_info);
        //接口信息
        builder.append("");
        //字段总数
        builder.append("FIELD COUNT：").append(this.fields_count).append(System.lineSeparator());
        //字段信息
        builder.append(this.field_info);
        //方法总数
        builder.append("METHOD COUNT：").append(this.fields_count).append(System.lineSeparator());
        //方法信息
        builder.append(this.method_info);
        //属性总数
        builder.append("ATTRIBUTES COUNT：").append(this.attributes_count).append(System.lineSeparator());
        //属性信息
        builder.append(this.attribute_info);
        return builder.toString();
    }
}
